#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

#define MAXLEN 10000

//2位16进制转10进制
int transHex(char* p) {
	int s = 0;
	//第1位
	if (p[0] >= 'A' && p[0] <= 'F')
		s = (10 + p[0] - 'A') * 16;
	else
		s = (p[0] - '0') * 16;
	//第2位
	if (p[1] >= 'A' && p[1] <= 'F')
		s += (10 + p[1] - 'A') ;
	else
		s += (p[1] - '0');
	return s;
}

//计算有效数据
void TransEff(char buf[], int n, char out[]) {
	int i, j = 0;
	for (i = 0; i < n; i += 2) {
		out[j] = transHex(buf + i);
		printf("%c", out[j]); //临时输出
		j++;
	}
	out[j] = 0;
	printf("\n");
}

int main() {
	char outdata[MAXLEN][40] = {0};
	int nmb = 0; 			//字符数

	char flag, version; 	//标记位和版本
	int addrNmb[] = {4, 4, 6, 8, 0, 4, 6, 8, 6, 4}; //地址字段长度

	char cnt[4] = { 0 }; 	//count字段
	char adr[10] = { 0 }; 	//存储地址字段
	char data[80] = { 0 };	//存储数据字段
	char check[6] = { 0 }; 	//校验码

	int len = 0;

	FILE* fp = fopen("E:\\ApplicationData.s19", "r");
	if (fp == 0) {
		printf("文件打开失败！\n");
		return 0;
	}
	//开始读文件
	while (!feof(fp)) {
		flag = 0;
		version = 0;
		if (fread(&flag, 1, 1, fp) != 1) //读取第一个字符S
			break;

		if (flag == '\r' || flag == '\n') //忽略换行符
			continue;

		if (flag != 'S') //读取的第一个字符不是S，读取错误
			break;
		if (fread(&version, 1, 1, fp) != 1) //读取第二个字符，版本
			break;
		if (version < '0' || version > '9') //读取的第二个字符不是0~9之间的字符，读取错误
			break;

		//读取count字段
		if (fread(cnt, 1, 2, fp) != 2)
			break;
		len = transHex(cnt) * 2; //得到后面字节的长度

		//读取地址
		if (fread(adr, 1, addrNmb[version - '0'], fp) != addrNmb[version - '0'])
			break;
		//读取数据部分
		if (fread(data, 1, len - addrNmb[version - '0'] - 2, fp) != (len - addrNmb[version - '0'] - 2)) //读取错误
			break;

		//读取校验码
		if (fread(check, 1, 2, fp) != 2)
			break;

		//计算有效数据
		TransEff(data, len - addrNmb[version - '0'] - 2, outdata[nmb]);
		nmb++;
	}
	fclose(fp);
	return 0;
}


